牛客挑战赛1115,很有难度的一些题,当然,我指的部分。
妖馨斋的五彩棒
给定三个正整数$A, B, C$。设$AA = \frac{AB}{C} + \frac{BC}{A} +\frac{AC}{B}$,$BB = A + B + C$。如果$AA > BB$输出$YES$,否则输出$NO$。
这道题我看到的时候直接笑喷了。。。又要有不少人想各种诡异的算法。实际上虽然数据范围很大,但是对于$python$来说直接暴力模拟是没有任何问题的。
1 | n = input().split() ; |
鸽天的放鸽序列
给定一个$N,K$,定义一个长为$N$的$01$序列${A_i}$,其权值为$\sum_{i = 1}^{N}((\sum_{j = 1}^iA_j)~mod~2)$,求有多少个$01$序列满足有$K$个1,并且权值最大。
这个题是要好好研究一下这个式子的。
发现里面的$\sum_{j = 1}^iA_j$指的是前缀和,因为是$01$序列,因此我们可以抽象成前缀中$1$的个数,但是他后面$mod$了一个$2$,因此我们知道了,对于每一个前缀,如果含有的$1$的个数为$1$那么贡献就为$1$否则贡献为$0$。
因此我们尝试去推一下构造这个$01$序列的规律。首先我们发现如果放$0$那么是可以产生和前一位相同的贡献的,因此如果前面的$1$的个数为偶数,那么这个时候我们放$0$必然是不优的,因此直接舍弃这个转移方式。当然,如果前面是$0$个$1$的话也是一样的,同样是会浪费掉这个$0$。
因此我们尝试去构造一个$Dp$转移,设$Dp[i][j]$表示构造到了前$i$个数,并且含有$j$个$1$的满足要求的序列有多少个。那么我们有这样的转移:
嗯,他看起来很好理解那我就不多说了,当然你也可以选择滚动数组,但是你会发现即使这样他也会超时,因此就考虑将所有的这些玩意组合起来看最后的结果。
你会发现最后的结果相当于是在$k$个$1$里面茶语$n - k$个$0$,并且这些$0$能插入的位置必须满足前缀和为奇数。因此我们一共有$\lfloor \frac{k}{2} \rfloor$可以插入,因此直接组合数即可。当然不要忘了求$Inv$。
1 |
|